Os Dados

file_extension: A extensão do arquivo.
data %>% select(file_extension) %>% unique
## # A tibble: 42 x 1
##    file_extension
##    <chr>         
##  1 md            
##  2 js            
##  3 json          
##  4 html          
##  5 py            
##  6 java          
##  7 css           
##  8 xml           
##  9 txt           
## 10 yml           
## # ... with 32 more rows

Como é possível ver no resumo acima, temos extensões para scripts, imagens, textos, etc.

month_day, the_month, the_year: Dia, mês e ano respectivamente em que a coleta dos dados foi efetuada.
data %>% select(-file_extension, -users) %>% summary()
##    month_day       the_month         the_year   
##  Min.   : 1.00   Min.   : 1.000   Min.   :2016  
##  1st Qu.: 8.00   1st Qu.: 3.000   1st Qu.:2016  
##  Median :15.00   Median : 4.000   Median :2016  
##  Mean   :15.49   Mean   : 5.427   Mean   :2016  
##  3rd Qu.:23.00   3rd Qu.: 8.000   3rd Qu.:2017  
##  Max.   :31.00   Max.   :12.000   Max.   :2017

Temos dados desde 2016 até 2017, como falado anteriormente.

users: Quantidade de usuários que modificaram aquele tipo de arquivo até a data da coleta.
data %>% select(users) %>% summary()
##      users      
##  Min.   :  501  
##  1st Qu.:  763  
##  Median : 1520  
##  Mean   : 2151  
##  3rd Qu.: 2782  
##  Max.   :10279

Como possível visualizar acima, temos tipos de arquivos que tiveram 501 usuários mas também temos outros que tiveram 10279 usuários.

Filtrando…

Como temos 42 tipos de arquivos diferentes, iremos selecionar apenas 2 para a nossa análise, que serão js (JavaScript) e py (Python).

languages <- data %>%
              filter(file_extension %in% c("py","js"))

Trabalhando nos dados

Para a nossa análise teremos que ter duas novas variáveis, que são popularity e is_weekend, que irão descrever quão popular é um arquivo e se a data da coleta corresponde a um fim de semana, respectivamente.

Popularity

Para popularidade não teremos tanto trabalho, iremos adotar a popularidade como sendo a mediana de usuários que contribuíram. Ou seja, quanto maior a média, mais popular é aquela linguagem.

Is Weekend

A partir das variáveis month_day, the_month e the_year iremos descobrir se a data se refere a um fim de semana ou não.

Para isso, utilizaremos as bibliotecas lubridate e timeDate.

languages %>%
  mutate(cronology = lubridate::ymd(paste(the_year,
                         the_month,
                         month_day)),
         is_weekend = timeDate::isWeekend(cronology)) -> languages

languages %>%
  sample_n(10)
## # A tibble: 10 x 7
##    file_extension month_day the_month the_year users cronology  is_weekend
##    <chr>              <int>     <int>    <int> <int> <date>     <lgl>     
##  1 js                    29         2     2016  7879 2016-02-29 FALSE     
##  2 py                    23        10     2016  2546 2016-10-23 TRUE      
##  3 py                     7         9     2016  4595 2016-09-07 FALSE     
##  4 py                    24         3     2016  4858 2016-03-24 FALSE     
##  5 py                    28         5     2016  2503 2016-05-28 TRUE      
##  6 py                     1         3     2017  5034 2017-03-01 FALSE     
##  7 js                    24         9     2016  3625 2016-09-24 TRUE      
##  8 py                    23        12     2016  3251 2016-12-23 FALSE     
##  9 py                    15         5     2016  2711 2016-05-15 TRUE      
## 10 js                    11         3     2016  7680 2016-03-11 FALSE

Como se comportam as linguagens em termos de Popularidade?

languages %>%
  group_by(file_extension, is_weekend) %>%
  summarise(popularity = median(users)) %>%
  ggplot(aes(
    x = reorder(file_extension, popularity),
    y = popularity,
    fill = is_weekend)) + 
  geom_bar(stat = "identity") + 
  labs(x = "Linguagem de Programação", y = "Popularidade") -> p

ggplotly(p)

Na visualização acima conseguimos perceber que JavaScript apresenta uma popularidade maior tanto nos dias de semana como nos finais de semana em relação a Python.

Como se comportam as alterações em uma linguagem de programação durante o tempo?

languages %>% 
  ggplot(aes(
      x = cronology,
      y = users,
      color = is_weekend)) +
    geom_point() +
    facet_wrap(~file_extension) +
    labs(x = "Cronologia", y = "Usuários") -> p

ggplotly(p)

Como é possível ver, ambas as linguagens possuem um comportamento semelhate, um crescimento rápido depois uma queda, mais uma subida e por fim uma queda nas edições dos ultimos meses.

Uma coisa bastante interessante é perceber que as alterações tanto em Python como em JavaScript apresentam um comportamento bastante semelhante quando feitas em finais de semana ou não.

Será que as linguagens possuem uma diferença significativa na popularidade durante a semana e o fim de semana?

Para isso, iremos analisar as linguagens separadamente…

JavaScript

languages %>%
  filter(file_extension == "js") %>%
  ggplot(aes(
    x = is_weekend, 
    y = users,
    group = is_weekend, 
    fill = is_weekend)) + 
  geom_boxplot() +
  labs(y = "Número de usuários") +
  ggtitle("Popularidade de JavaScript (dias úteis vs fim de semana)") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) -> p

ggplotly(p)

Com a visualização, podemos entender que os desenvolvedores JavaScript costumam trabalhar durante a semana.

Como se trata de uma amostra e com alguns dados faltantes, não podemos concluir com tanta confiança.

Para isso, iremos utilizar a técnica de Bootstrapping para nos ajudar com a diferença não pareada entre a popularidade durante a semana e no fim de semana.

Bootstrapping - JavaScript

languages %>%
  filter(file_extension == "js") -> js

b.diff.means <- bootstrap2(js$users, 
                          treatment = js$is_weekend, 
                          median, R = 10000)

means.diff = CI.percentile(b.diff.means, probs = c(.025, .975))
means.diff
##                    2.5% 97.5%
## median: FALSE-TRUE 2685  3050
data.frame(means.diff) %>%
  ggplot(aes(
    x = "Diferença",
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "red") +
  labs(x = "")

O C.I. nos mostra que JavaScript é bem mais popular durante a semana, pois o intervalo é bem acima de 0. Isso de fato era esperado, dado as visualizações anteriores e também (intuitivamente) as empresas que utilizam JavaScript geralmente tem o seu ciclo de trabalho apenas durante a semana.

Portanto, podemos afirmar com 95% de confiança que JavaScript é mais popular durante a semana, dado que o intervalo de confiança da diferença não pareada para popularidade na semana e no fim de semana não passa pelo eixo y = 0.

Python

languages %>%
  filter(file_extension == "py") %>%
  ggplot(aes(
    x = is_weekend, 
    y = users,
    group = is_weekend, 
    fill = is_weekend)) + 
  geom_boxplot() +
  labs(y = "Number of editing users") +
  ggtitle("Python popularity (weekdays vs weekend)") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) -> p

ggplotly(p)

Com a visualização, podemos entender que os desenvolvedores Python também costumam trabalhar bem mais durante a semana.

Bootstrapping - Python

languages %>%
  filter(file_extension == "py") -> py

b.diff.means <- bootstrap2(py$users, 
                          treatment = py$is_weekend, 
                          median, R = 10000)

means.diff = CI.percentile(b.diff.means, probs = c(.025, .975))
means.diff
##                    2.5% 97.5%
## median: FALSE-TRUE 2062  2236
data.frame(means.diff) %>%
  ggplot(aes(
    x = "Difference",
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "cyan") +
  labs(x = "")

O C.I. nos mostra que Python também é bem mais popular durante a semana, pois o intervalo é bem acima de 0. Isso de fato também era esperado.

Portanto, de forma semelhante, podemos afirmar com 95% de confiança que Python é mais popular durante a semana, dado que o intervalo de confiança da diferença não pareada para popularidade na semana e no fim de semana não passa pelo eixo y = 0.

Existe uma diferença significativa entre a popularidade das duas linguagens nos fins de semana?

languages %>% 
  filter(is_weekend) %>%
  ggplot(aes(
    x = file_extension, 
    y = users,
    group = file_extension, 
    fill = file_extension)) + 
  geom_boxplot() +
  ggtitle("Python vs JavaScript (Weekends)") +
    theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank()) +
  labs(y = "Number of users editing files")

Dada a visualização acima, podemos ver que JavaScript é bem mais popular que Python.

Utilizando a mesma técnica para Bootstrapping

Bootstrapping

languages %>%
  filter(is_weekend) -> weekend

b.diff.means <- bootstrap2(weekend$users, 
                          treatment = weekend$file_extension, 
                          median, R = 10000)

means.diff = CI.percentile(b.diff.means, probs = c(.025, .975))
means.diff
##               2.5% 97.5%
## median: js-py 1580  1883
data.frame(means.diff) %>%
  ggplot(aes(
    x = "Difference",
    ymin = X2.5., 
    ymax = X97.5.)) +
  geom_errorbar(width = .2) +
  geom_hline(yintercept = 0, colour = "brown") +
  labs(x = "")

A diferença entre a popularidade existe sim. Podemos concluir que JavaScript é mais popular em finais de semana em relação a Python, como também pudemos perceber nas demais visualizações acima.

Portanto, observando os intervalos de confiança para as diferenças não pareadas entre JavaScript e Python durante os finais de semana, podemos dizer com um grau de confiança de 95% que JavaScript é significativamente mais popular que Python nos fins de semana.